package com.booter.zookeeper;


import com.booter.zookeeper.listener.ChildListener;
import com.booter.zookeeper.listener.ConnStateListener;
import com.booter.zookeeper.listener.DataListener;

import java.util.List;

/**
 * 所有路径必须以"/" 开头
 *
 * @author admin
 */
public interface ZkClient {

    /**
     * 创建空路径
     *
     * @param path       路径名称
     * @param ephemeral  是否临时节点
     * @param sequential 是否为递增序列
     * @return
     */
    String create(String path, boolean ephemeral, boolean sequential);

    /***
     * 创建路径
     *
     * @param path
     *        路径名称
     * @param data
     *        节点数据
     * @param ephemeral
     *        是否临时节点
     * @param sequential
     *        是否为递增序列
     * @return
     */
    String create(String path, Object data, boolean ephemeral,
                  boolean sequential);

    /***
     * 删除路径
     *
     * @param path
     * @return
     */
    boolean delete(String path);

    /**
     * 检查路径是否存在
     *
     * @param path
     * @return
     */
    boolean exists(String path);

    /**
     * 获取节点数据
     *
     * @param path
     * @return
     */
    <T> T getData(String path);

    /**
     * 为已存在的节点设置数据
     *
     * @param path
     * @param data
     */
    void setData(String path, Object data);

    /***
     * 查询指定路径下子节点
     *
     * @param path
     * @return
     */
    List<String> getChildren(String path);

    /***
     * 添加节点监听器
     *
     * @param path
     * @param listener
     * @return
     */
    List<String> addChildListener(String path, ChildListener listener);

    /***
     * 移除指定节点监听器
     *
     * @param path
     * @param listener
     */
    void removeChildListener(String path, ChildListener listener);

    /***
     * 添加节点数据监听器
     *
     * @param path
     * @param listener
     */
    void addDataListener(String path, DataListener listener);

    /***
     * 移除节点数据监听器
     *
     * @param path
     * @param listener
     */
    void removeDataListener(String path, DataListener listener);

    /***
     * 添加状态监听器
     *
     * @param listener
     */
    void addConnStateListener(ConnStateListener listener);

    /***
     * 移除状态监听器
     *
     * @param listener
     */
    void removeStateListener(ConnStateListener listener);

    /***
     * 是否关闭
     *
     * @return
     */
    boolean isConnected();

    /**
     * 关闭客户端
     */
    void close();

}
